pub struct Post {
    state: Option<Box<dyn State>>,
    content: String,
}

impl Post{
    pub fn new()->{
        Post{
            state:Some(Box::new(Draft{})),
            content:String::new()
        }
    }
}

impl Post{
    pub fn add_text(&mut self,text :&str){
        self.content.push_str(text);
    }
    pub fn content(&self)->&str{
        ""
    }
    pub fn approve(&mut self){
        if let Some(s)=self.state.take(){
            self.state=Some(s.approve())
        }
    }
}

trait State{
    fn request_review(self: Box<Self>) -> Box<dyn State>;
}

struct Draft{}

impl State for Draft{
    fn request_review(self:Box<Self>)->Box<dyn State>{
        Box::new(PendingReview {})
    }
}

struct PendingReview{}

impl State for PendingReview{
    fn request_review(self:Box<Self>)->Box<dyn State>{
        self
    }
}

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}
